package com.ai.vr.service;

import com.sun.jna.ptr.IntByReference;

/**
 * OpenVR 数据采集器
 * @author houwenpeng
 */
public class OpenVRDataCollector {

    private static final int k_unTrackedDeviceIndex_Hmd = 0; // HMD 设备索引

    // 是否已初始化
    private boolean isInitialized = false; // 是否已初始化

    /**
     * 构造函数：初始化 OpenVR
     */
    public OpenVRDataCollector() {
        // 如果没有初始化，进行初始化
        if (!isInitialized) {
            try {
                // 初始化 OpenVR
                IntByReference initResult = new IntByReference();
                OpenVR.INSTANCE.VR_InitInternal(initResult, null);
                // 检查初始化结果
                int value = initResult.getValue();
                if (value != 0) {
                    switch (value) {
                        case 0:
                            System.err.println("初始化成功 (错误码 :" + value+")");
                            break;
                        case 100:
                            System.err.println("VR 初始化失败: 未知错误 (错误码 :" + value+")");
                            break;
                        case 101:
                            System.err.println("VR 初始化失败: 没有找到 VR 运行环境 (错误码 :" + value+")");
                            break;
                        case 102:
                            System.err.println("VR 初始化失败: VR 安装损坏 (错误码 :" + value+")");
                            break;
                        case 103:
                            System.err.println("VR 初始化失败: 未找到 VR 客户端 DLL (错误码 :" + value+")");
                            break;
                        case 104:
                            System.err.println("VR 初始化失败: 依赖文件未找到 (错误码 :" + value+")");
                            break;
                        case 105:
                            System.err.println("VR 初始化失败: 未找到设备工厂 (错误码 :" + value+")");
                            break;
                        case 106:
                            System.err.println("VR 初始化失败: 没有找到指定接口 (错误码 :" + value+")");
                            break;
                        case 107:
                            System.err.println("VR 初始化失败: 接口无效 (错误码 :" + value+")");
                            break;
                        case 108:
                            System.err.println("VR 初始化失败: HMD 未找到 (错误码 :" + value+")");
                            break;
                        case 109:
                            System.err.println("VR 初始化失败: 系统未初始化 (错误码 :" + value+")");
                            break;
                        case 110:
                            System.err.println("VR 初始化失败: 未找到路径注册信息 (错误码 :" + value+")");
                            break;
                        case 111:
                            System.err.println("VR 初始化失败: 配置路径未找到 (错误码 :" + value+")");
                            break;
                        case 112:
                            System.err.println("VR 初始化失败: 日志路径未找到 (错误码 :" + value+")");
                            break;
                        case 113:
                            System.err.println("VR 初始化失败: 路径注册表不可写 (错误码 :" + value+")");
                            break;
                        case 114:
                            System.err.println("VR 初始化失败: 初始化应用信息失败 (错误码 :" + value+")");
                            break;
                        case 115:
                            System.err.println("VR 初始化失败: 初始化时需要重试 (错误码 :" + value+")");
                            break;
                        case 116:
                            System.err.println("VR 初始化失败: 初始化被用户取消 (错误码 :" + value+")");
                            break;
                        case 117:
                            System.err.println("VR 初始化失败: 另一个应用正在启动 (错误码 :" + value+")");
                            break;
                        case 118:
                            System.err.println("VR 初始化失败: 设置初始化失败 (错误码 :" + value+")");
                            break;
                        case 119:
                            System.err.println("VR 初始化失败: 系统正在关闭 (错误码 :" + value+")");
                            break;
                        case 120:
                            System.err.println("VR 初始化失败: 创建对象过多 (错误码 :" + value+")");
                            break;
                        case 121:
                            System.err.println("VR 初始化失败: 后台应用未找到服务器 (错误码 :" + value+")");
                            break;
                        case 122:
                            System.err.println("VR 初始化失败: 不支持组合器 (错误码 :" + value+")");
                            break;
                        case 123:
                            System.err.println("VR 初始化失败: 实用程序应用不可用 (错误码 :" + value+")");
                            break;
                        case 124:
                            System.err.println("VR 初始化失败: 内部初始化错误 (错误码 :" + value+")");
                            break;
                        case 125:
                            System.err.println("VR 初始化失败: 未找到 HMD 驱动 (错误码 :" + value+")");
                            break;
                        case 126:
                            System.err.println("VR 初始化失败: HMD 检测失败 (错误码:" + value+")");
                            break;
                        case 127:
                            System.err.println("VR 初始化失败: 未找到 VR 监控 (错误码 :" + value+")");
                            break;
                        case 128:
                            System.err.println("VR 初始化失败: VR 监控启动失败 (错误码 :" + value+")");
                            break;
                        case 129:
                            System.err.println("VR 初始化失败: 不支持低功耗监控 (错误码 :" + value+")");
                            break;
                        case 130:
                            System.err.println("VR 初始化失败: 无效的应用程序类型 (错误码 :" + value+")");
                            break;
                        case 131:
                            System.err.println("VR 初始化失败: 监控应用不可用 (错误码 :" + value+")");
                            break;
                        case 132:
                            System.err.println("VR 初始化失败: 设置中禁用监控 (错误码 :" + value+")");
                            break;
                        case 133:
                            System.err.println("VR 初始化失败: 未找到 VR Dashboard (错误码 :" + value+")");
                            break;
                        case 134:
                            System.err.println("VR 初始化失败: VR Dashboard 启动失败 (错误码 :" + value+")");
                            break;
                        default:
                            System.err.println("初始化失败，未知错误码: " + value);
                    }
                    return; // 直接退出
                }
                System.out.println("OpenVR 初始化成功");
                isInitialized = true;
            } catch (UnsatisfiedLinkError e) {
                System.err.println("无法加载 OpenVR DLL: " + e.getMessage());
            } catch (Exception e) {
                System.err.println("VR 初始化出现未知错误: " + e.getMessage());
            }
        }
    }

    /**
     * 获取 HMD 设备的姿态数据
     * @return
     */
    public float[] getHmdPose() {
        if (!isInitialized) {
            System.out.println("OpenVR 未初始化！");
            return null;
        }

        // 获取设备姿态
        float[] trackedDevicePoseArray = new float[16];
        boolean success = OpenVR.INSTANCE.VRSystem_GetDeviceToAbsoluteTrackingPose(2, 0.0f, trackedDevicePoseArray, 16);
        if (!success) {
            System.out.println("获取设备姿态失败");
            return null;
        }

        // 返回 HMD 设备的姿态数据
        return trackedDevicePoseArray;
    }

    /**
     * 获取手柄控制器状态
     * @param controllerIndex
     * @return
     */
    public VRControllerState_t getControllerState(int controllerIndex) {
        // 获取手柄控制器状态
        VRControllerState_t controllerState = new VRControllerState_t();
        boolean success = OpenVR.INSTANCE.VRSystem_GetControllerState(controllerIndex, controllerState);
        if (!success) {
            System.out.println("获取手柄控制器状态失败");
            return null;
        }
        // 返回手柄控制器状态
        return controllerState;
    }

    /**
     *  关闭 OpenVR 系统
     */
    public void shutdown() {
        if (isInitialized) {
            OpenVR.INSTANCE.VR_ShutdownInternal();
            isInitialized = false;
        }
    }
}